package com.example.api.interceptor;

import com.example.api.utils.JwtUtil;
import io.jsonwebtoken.ExpiredJwtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // 获取请求头中的 token
        String token = request.getHeader("Authorization");

        // 如果是 OPTIONS 请求，直接放行（通常是 CORS 请求）
        if ("OPTIONS".equals(request.getMethod())) {
            return true;
        }

        // 如果 token 为空，返回 401 未授权
        if (token == null || token.isEmpty()) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
            response.getWriter().write("未登录或 token 丢失");
            return false;
        }

        // 验证 token 格式，检查是否以 "Bearer " 开头
        if (!token.startsWith("Bearer ")) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
            response.getWriter().write("无效的 token 格式");
            return false;
        }

        try {
            // 去除 "Bearer " 前缀后验证 token
            jwtUtil.verifyToken(token.substring(7));  // 获取去掉 "Bearer " 的部分
            return true;
        } catch (ExpiredJwtException e) {
            // Token 过期，返回 401 错误
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
            response.getWriter().write("Token 已过期");
            return false;
        } catch (Exception e) {
            // 其他错误，如 token 无效，返回 401 错误
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
            response.getWriter().write("未登录或 token 无效");
            return false;
        }
    }
}
